import os
import dashscope
from datetime import datetime
from typing import List, Dict


def generate_travel_guide(api_key: str,
                          base_info: Dict,
                          preferences: Dict,
                          resources: Dict,
                          selected_interests: List[str],
                          existing_interests: List[str] = None) -> str:
    """
    使用dashscope官方SDK生成旅行攻略

    参数：
    api_key - 通义千问API密钥
    base_info - 基础信息字典
    preferences - 偏好需求字典
    resources - 资源配置字典
    selected_interests - 用户本次选择的兴趣标签
    existing_interests - 用户历史兴趣标签（可选）
    """
    # 合并兴趣标签
    all_interests = list(set((existing_interests or []) + selected_interests))

    # 构造系统提示词
    system_prompt = """你是一个专业的旅行规划师，请根据以下用户需求生成结构清晰的旅行攻略：
1. 使用Markdown格式
2. 包含每日时间安排表
3. 给出实用建议和注意事项
4. 符合用户指定的预算和行程风格"""

    # 构造用户输入
    user_input = f"""
【目的地】{base_info['destination']}

【时间安排】
- 出发时间：{base_info['departure_date'].strftime('%Y年%m月')}
- 行程时长：{base_info['duration']}

【人员构成】{base_info['group_description']}

【兴趣主题】{", ".join(all_interests)}

【行程风格】{preferences['style']}

【特殊需求】{preferences['restrictions'] or "无"}

【预算范围】{resources['budget']}

【住宿要求】{resources['accommodation']}

【交通方式】{resources['transportation']}
"""

    # 构建消息列表
    messages = [
        {"role": "system", "content": system_prompt},
        {"role": "user", "content": user_input}
    ]

    try:
        response = dashscope.Generation.call(
            model="qwen-max",
            api_key=api_key,
            messages=messages,
            result_format='message',  # 返回结构化消息
            temperature=0.7,  # 控制创意程度
            top_p=0.9,  # 控制多样性
            seed=1234  # 固定随机种子保证可重复性
        )

        if response.status_code == 200:
            return response.output.choices[0].message.content
        else:
            print(f"API调用失败，状态码：{response.status_code}, 错误信息：{response.message}")
            return None

    except Exception as e:
        print(f"发生异常：{str(e)}")
        return None


# 示例使用
if __name__ == "__main__":
    # 配置API密钥（推荐通过环境变量设置）
    API_KEY = os.getenv('DASHSCOPE_API_KEY')

    # 构建测试参数
    test_params = {
        "base_info": {
            "destination": "北京故宫",
            "departure_date": datetime(2024, 10, 1),
            "duration": "3天2晚",
            "group_description": "2位成人带1名10岁儿童"
        },
        "preferences": {
            "style": "文化深度体验+亲子友好",
            "restrictions": "需要午休时间"
        },
        "resources": {
            "budget": "中档（日均1000元）",
            "accommodation": "四星级酒店，王府井地区",
            "transportation": "地铁+网约车"
        },
        "selected_interests": ["宫廷文化", "古代建筑"],
        "existing_interests": ["历史", "博物馆"]
    }

    # 生成攻略
    guide = generate_travel_guide(
        api_key=API_KEY,
        **test_params
    )

    if guide:
        print("成功生成旅行攻略：\n")
        print(guide)
    else:
        print("攻略生成失败")